package org.lg.example;

//判断对象是否在GC时候被回收了
public class TestGC1 {
	// 无法马上回收byte数组
	public void localGc1() {
		byte[] a = new byte[6 * 1024 * 1024];
		System.gc();//人为指定调用垃圾清理
	}
	//
//	// 可以回收，引用计数，根可达
	public void localGc2() {
		byte[] a = new byte[6 * 1024 * 1024];
		a = null;
		System.gc();
	}
	//
//	//gc时候，无法回收，虽然已经a失效，离开作用域，但在局部变量表中，方法结束才销毁局部变量，同时也指向byte数组
//	public void localGc3() {
//		{
//			byte[] a = new byte[6 * 1024 * 1024];
//		}
//		System.gc();
//	}
////gc成功
	public void localGc4() {
		{
			byte[] a = new byte[6 * 1024 * 1024];//a保存是一个地址
		}
		//int c = 10;//a失效 c占了a的位置 c也是保存一个地址，所以对于局部变量表而言，变量都是一样 ，如果要新生成一个变量
		//使用已失效的变量的位置
		System.gc();
	}
	public void localGc41() {

		byte[] a = new byte[6 * 1024 * 1024];//a保存是一个地址

		int c = 10;//a失效 c占了a的位置 c也是保存一个地址，所以对于局部变量表而言，变量都是一样 ，如果要新生成一个变量
		//使用已失效的变量的位置
		System.gc();
	}
	////localGc1执行完 栈帧销毁 全部失效，回收成功
	public void localGc5() {
		localGc1();//方法执行完成，所有栈中的局部变量和堆中的实际对象断开连接
		System.out.println("-----------------------------");
		System.gc();//清理掉那些没有人用的对象
	}

	//jvm运行参数 -XX:+PrintGC
	//[GC (System.gc())  8140K->640K(125952K), 0.0081668 secs] 完成GC 消除6M
	//[Full GC (System.gc())  640K->528K(125952K), 0.0081720 secs] 完成FullGC
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TestGC1 testGC1 = new TestGC1();
		testGC1.localGc4();
	}

}
